[Log #2] LogBack을 이용한 로그 설정
[애플리케이션 코드] → Logger.info/debug/warn(...)
│
▼
logback-spring.xml
│
┌─────────────┼─────────────┐
▼ ▼ ▼
ConsoleAppender RollingFileAppender (SMTP/DB Appender 등)
(콘솔 출력) (파일 저장 + 롤링) (선택적 확장)LogBack
- Spring Boot에서 로그를 다룰 때 가장 많이 쓰는 로깅 구현체는 Logback
- logback-spring.xml을 이용하면 로그 포맷, 출력 방식, 파일 보관 정책 등을 유연하게 설정 가능.
로그 출력 경로 제어
| Appender 클래스 | 설명 |
|---|---|
| ConsoleAppender | 콘솔에 출력 |
| FileAppender | 고정된 파일에 저장 |
| RollingFileAppender | 시간/용량 기준으로 파일 분리 저장 |
| SMTPAppender | 메일 전송용 |
| DBAppender | DB에 로그 저장용 |
로그 Level정의
| Level | 설명 |
|---|---|
| OFF | 로그 기록 안 함 |
| FATAL | 시스템 치명적 오류 |
| ERROR | 예상하지 못한 오류 |
| WARN | 경고, 주의 필요 |
| INFO | 운영 중 참고용 메시지 |
| DEBUG | 개발 중 디버깅 정보 |
| TRACE | 가장 세세한 단계의 로그 |
로그 롤링 정책 (파일 관리)
fileNamePattern: 저장될 파일명 패턴
maxHistory: 보관할 최대 파일 개수
maxFileSize: 파일 1개의 최대 용량
totalSizeCap: 전체 로그 용량 제한 (초과 시 오래된 로그 삭제됨)
로그 패턴 정책
| 패턴 | 설명 |
|---|---|
| %d{yyyy-MM-dd HH:mm:ss.SSS} | 로그 발생 시점의 날짜와 시간을 포맷에 맞춰 출력→ 2025-04-07 15:32:12.451 |
| --- | --- |
| %magenta(…) | 해당 내용(여기선 쓰레드)을 보라색으로 출력 (콘솔 색상 적용용) |
| %thread | 로그를 출력한 스레드 이름 |
| %highlight(…) | 로그 레벨에 따라 색상을 자동 적용(ex INFO → 녹색, WARN → 노란색, ERROR → 빨간색 등) |
| %level | 로그 레벨(INFO, WARN, ERROR 등)을 표시 |
| %logger{5} | 로거 이름(클래스명 또는 패키지 경로)의 마지막 5개 단어만 표시(ex com.example.controller.UserController → c.e.c.UserController) |
| - | 구분자 (시각적 효과) |
| %msg | 실제 로그 메시지 내용 |
| %n | 줄바꿈 (platform-specific newline, \n 또는 \r\n 등) |
LogBack 설정 예시
[ 로그 저장 형식 지정 및 설정 ]
<!-- 콘솔 출력 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_PATTERN}</Pattern>
</encoder>
</appender>
<!-- 파일 출력 + 롤링 -->
<appender name="ROLLING_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${ROLLING_PATTERN}</pattern>
</encoder>
<file>${FILE_NAME}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_NAME_PATTERN}</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<totalSizeCap>${TOTAL_SIZE}</totalSizeCap>
</rollingPolicy>
</appender>[ root 로거 설정 ]
<root level="INFO">
// 콘솔 출력 및 파일 출력
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</root>[ 특정 패키지 로그 설정 ]
<logger name="com.example.application.paging" level="DEBUG" additive="false" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
ex) JDBC 관련 로그 설정
<logger name="jdbc" level="OFF" additive="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>전체 코드
( Console + File 로그 출력 XML )
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 로그 xml 파일 환경변수 사용 property -->
<property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %magenta([%thread]) %highlight([%-3level]) %logger{5} - %msg %n" />
<property name="ROLLING_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %logger{5} - %msg %n" />
<property name="FILE_NAME" value="C:/logs/application.log" />
<property name="LOG_NAME_PATTERN" value="./logs/application-%d{yyyy-MM-dd HH:mm:ss}.%i.log" /> <!-- 1초 기준 로그 저장-->
<property name="MAX_FILE_SIZE" value="10MB" />
<property name="TOTAL_SIZE" value="30MB" />
<property name="MAX_HISTORY" value="30" /> <!-- 보관 파일 개수 -->
<!-- ----------------------------------------------------------- -->
<!-- Console appender 설정 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_PATTERN}</Pattern>
</encoder>
</appender>
<!-- ----------------------------------------------------------- -->
<!-- Rolling File appender 설정 -->
<appender name="ROLLING_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${ROLLING_PATTERN}</pattern>
</encoder>
<file>${FILE_NAME}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_NAME_PATTERN}</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<totalSizeCap>${TOTAL_SIZE}</totalSizeCap>
</rollingPolicy>
</appender>
<!-- ----------------------------------------------------------- -->
<!-- SQL 쿼리 로그 기록 (level 및 로그 기록 여부 지정) -->
<!-- JDBC 관련 로그 OFF + 로거 전파 x (상위로그 출력 x) -->
<logger name="jdbc" level="OFF" additive="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<!-- SQL 로그 + 로거 전파 x (상위로그 출력 x) -->
<logger name="jdbc.sqlonly" level="DEBUG" additive="false" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<!-- 쿼리 성능 측정 로그 OFF + 로거 전파 x (상위로그 출력 x) -->
<logger name="jdbc.sqltiming" level="OFF" additive="false" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<logger name="org.hibernate.SQL" level="DEBUG" additive="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<!-- ----------------------------------------------------------- -->
<!-- 패키지 하위 로그 기록 (level 지정// 각자 맞는 패키지명으로 변경 필요) -->
<logger name="com.example.application.fileInputOutput" level="INFO" additive="true" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<logger name="com.example.application.paging" level="DEBUG" additive="false" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<!-- ----------------------------------------------------------- -->
<!-- 전역 로그 설정 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</root>
<!-- ----------------------------------------------------------- -->
</configuration>로그파일 기록 현황
설정한 LOG_NAME_PATTERN에 따라 logs/ 디렉토리에 아래와 같이 시간·용량 기준으로 분리된 로그 파일들이 순차적으로 쌓이는 것을 확인할 수 있다.
logs/
├── application-2025-04-07-10.0.log
├── application-2025-04-07-11.0.log
├── application-2025-04-07-12.0.log
└── application.log (현재 기록 중인 로그 파일)각 파일은 maxFileSize(10MB) 도달 시 새 파일로 분리되고, totalSizeCap(30MB) 초과 시 가장 오래된 파일부터 자동 삭제된다.
참고 자료
https://logback.qos.ch/manual/configuration.html
[Chapter 3: Configuration
In symbols one observes an advantage in discovery which is greatest when they express the exact nature of a thing briefly and, as it were, picture it; then indeed the labor of thought is wonderfully diminished. —GOTTFRIED WILHELM LEIBNIZ Chapter 3: Logba
logback.qos.ch](https://logback.qos.ch/manual/configuration.html)
https://logging.apache.org/log4j/2.x/manual/configuration.html
[Configuration file :: Apache Log4j
Starting with Log4j 2, the configuration file syntax has been considered part of the public API and has remained stable across significant version upgrades. The syntax of the configuration file changed between Log4j 1 and Log4j 2. Files in the Log4j 1 s
logging.apache.org](https://logging.apache.org/log4j/2.x/manual/configuration.html)
관련 문서
- (학습/프로젝트/토이프로젝트/로그) [Log #1] 로그 이해하기 — 로그 이해하기(로그 레벨, 파사드 패턴)를 다루는 선행 편
- (학습/개발 (CS)/CS 기초) Logback — logback-spring.xml 설정(Appender, Rolling Policy 등)이 CS 기초 노트의 예제와 거의 동일
- (학습/프레임워크/Spring Framework) Log 설정 및 Logging 사용 — 이 노트가 실습하는 Logback 설정의 배경이 되는 SLF4J/로그레벨 기본 개념을 정리한 노트